package org.javahispano.javacup.tacticas_aceptadas.SigaSaga.tacticaSiga_Saga_FC;

import java.util.ArrayList;
import java.util.List;
import java.util.Random;

import org.javahispano.javacup.modelo.Comando;
import org.javahispano.javacup.modelo.ComandoGolpearBalon;
import org.javahispano.javacup.modelo.ComandoIrA;
import org.javahispano.javacup.modelo.Constantes;
import org.javahispano.javacup.modelo.Posicion;
import org.javahispano.javacup.modelo.SituacionPartido;
import org.javahispano.javacup.modelo.Tactica;
import org.javahispano.javacup.modelo.TacticaDetalle;

	public class TacticaSigaSagaFC implements Tactica {

	    ArrayList<Comando> comandos = new ArrayList<Comando>();
	    
	    Posicion alineacion1[]=new Posicion[]{
	        new Posicion(0.2595419847328244,-50.41044776119403),
	        new Posicion(-20.20979020979021,-32.07013574660634),
	        new Posicion(0.2595419847328244,-31.082089552238806),
	        new Posicion(19.984732824427482,-31.6044776119403),
	        new Posicion(-9.034965034965035,-14.25339366515837),
	        new Posicion(11.174825174825173,-14.490950226244346),
	        new Posicion(-11.174825174825173,9.97737556561086),
	        new Posicion(11.174825174825173,7.126696832579185),
	        new Posicion(0, 15),
	        new Posicion(10.307692307692307,31.59502262443439),
	        new Posicion(-10.3986013986014,29.93212669683258)
	    };

	    Posicion alineacion2[]=new Posicion[]{
	        new Posicion(0.2595419847328244,-50.41044776119403),
	        new Posicion(-19.020979020979023,-32.54524886877828),
	        new Posicion(0.0,-32.07013574660634),
	        new Posicion(19.734265734265733,-31.59502262443439),
	        new Posicion(-10.937062937062937,-18.29185520361991),
	        new Posicion(5.230769230769231,-17.816742081447966),
	        new Posicion(-10.223776223776223,-5.226244343891403),
	        new Posicion(7.846153846153847,-6.414027149321266),
	        new Posicion(0.7132867132867133,-11.165158371040723),
	        new Posicion(13.314685314685315,-1.6628959276018098),
	        new Posicion(-10.937062937062937,-0.9502262443438915)
	    };

	    Posicion alineacion3[]=new Posicion[]{
	        new Posicion(0.2595419847328244,-50.41044776119403),
	        new Posicion(-22.11188811188811,-30.16968325791855),
	        new Posicion(-1.4265734265734267,-29.457013574660635),
	        new Posicion(18.545454545454543,-30.88235294117647),
	        new Posicion(-1.902097902097902,-17.104072398190045),
	        new Posicion(8.797202797202797,-8.314479638009049),
	        new Posicion(-9.272727272727272,-9.97737556561086),
	        new Posicion(0.0,-1.4253393665158371),
	        new Posicion(-4.041958041958042,-2.6131221719457014),
	        new Posicion(14.503496503496503,-2.3755656108597285),
	        new Posicion(-18.307692307692307,-3.3257918552036196)
	    };

	    public Posicion[] getPosicionSaca(SituacionPartido sp) {
	    return alineacion3;
	    }

	    public Posicion[] getPosicionRecive(SituacionPartido sp) {
	    return alineacion2;
	    }

	    public TacticaDetalle getDetalle() {
	    	return new TacticaSigaSagaFCDetalle();
	    }

	    public List<Comando> ejecutar(SituacionPartido sp) {
	    	
	    	comandos.clear();

	    	int[] jugadoresPuedenRematar = sp.puedenRematar();
	    	boolean[] puedeRematar = new boolean[11];
	    	int[] irHaciaElBalon = new int[11];
	    	Posicion[] posicionJugadores = sp.misJugadores();
	    	
	    	Posicion posicionBalon = sp.balon();
	    	int[] jugadoresProximosBalon = posicionBalon.indicesMasCercanos(alineacion1);
	    	
	    	irHaciaElBalon[jugadoresProximosBalon[0]] = 1;
	    	irHaciaElBalon[jugadoresProximosBalon[1]] = 2;
	    	irHaciaElBalon[jugadoresProximosBalon[2]] = 3;   	
	    	irHaciaElBalon[jugadoresProximosBalon[3]] = 4;
	    	irHaciaElBalon[jugadoresProximosBalon[4]] = 5;   	
	    	irHaciaElBalon[jugadoresProximosBalon[5]] = 6;
	    	irHaciaElBalon[jugadoresProximosBalon[6]] = 7;   	

	    	
	    	
	    	for( int i = 0; i < jugadoresPuedenRematar.length; i++)
	    	{
	    		int indiceJugador = jugadoresPuedenRematar[i];
	    		puedeRematar[indiceJugador] = true;
	    	}
	    	if( jugadoresPuedenRematar.length > 0)
	    	{
	    		int mejorRemate = jugadoresPuedenRematar[0];
	    		puedeRematar[mejorRemate]=true;
	    	}
	    	//jugador1
	    	TacticaPortero( sp, puedeRematar, posicionJugadores );
	    	
	    	//jugador 2
	    	TacticaDefensa( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 1 );

	    	//jugador 3
	    	TacticaDefensa( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 2 );

	    	//jugador 4
	    	TacticaDefensa( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 3 );

	    	//jugador 5
	    	TacticaMedio( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 4 );

	    	//jugador 6
	    	TacticaMedio( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 5 );

	    	//jugador 7
	    	TacticaMedio( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 6 );

	    	//jugador 8
	    	TacticaMedio( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 7 );

	    	//jugador 9
	    	TacticaMedioDelantero( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 8 );

	    	//jugador 10
	    	TacticaDelantero( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 9, 10 );

	    	//jugador 11
	    	TacticaDelantero( sp, puedeRematar, posicionJugadores, irHaciaElBalon, 10, 9 );

	    	
	    	return comandos;
	    }

	    private void TacticaPortero( SituacionPartido sp, boolean[] puedeRematar, Posicion[] posicionJugadores )
	    {
			Random rand = new Random();
	    	
	    	if(puedeRematar[0])
	    		comandos.add(new ComandoGolpearBalon(0, Constantes.centroArcoSup.moverPosicion(rand.nextInt(10)-5, 0), 1, true ));
	    	if( sp.balon().distancia(alineacion1[0]) < 10)
	    		comandos.add(new ComandoIrA(0, sp.balon()));
	    	else
	    		comandos.add(new ComandoIrA( 0,alineacion1[0]));

	    }

	    private void TacticaDefensa( SituacionPartido sp, boolean[] puedeRematar, Posicion[] posicionJugadores, int[] irHaciaElBalon, int jugador )
	    {
	    	if( sp.balon().getY() > 0 )
	    	{
	    		comandos.add(new ComandoIrA( jugador, alineacion1[jugador]));
	    		return;
	    	}
	    	if(puedeRematar[jugador])
	    	{
	   			comandos.add(new ComandoGolpearBalon(jugador, Constantes.centroArcoSup, 1,true));
	   			return;
	    	}
	    	if( sp.balon().getY() < - Constantes.LARGO_CAMPO_JUEGO / 4)
	    	{
	    		comandos.add( new ComandoIrA( jugador, sp.balon() ) );    		
	    		return;
	    	}
	    	else//if (sp.balon().getY() < Constantes.LARGO_CAMPO_JUEGO / 2)
	    	{
	        	if( irHaciaElBalon[jugador] == 1 )
	        		comandos.add( new ComandoIrA( jugador, sp.balon() ) );    		
	        	else if( irHaciaElBalon[jugador] == 2 )	
	        		comandos.add( new ComandoIrA( jugador, sp.balon().moverPosicion(0, -5) ) );
	        	else if( irHaciaElBalon[jugador] == 3 )
	        		comandos.add( new ComandoIrA( jugador, sp.balon().moverPosicion(0, -10) ) );
	        	else
	        		comandos.add(new ComandoIrA( jugador, alineacion1[jugador]));
	    	}	
	    }    
	   
	    
	    private void TacticaMedio( SituacionPartido sp, boolean[] puedeRematar, Posicion[] posicionJugadores, int[] irHaciaElBalon, int jugador )
	    {
	    	if( sp.balon().getY() < - 30 || sp.balon().getY() > 30 )
	    	{
	    		comandos.add(new ComandoIrA(jugador, alineacion1[jugador]));
	    		return;
	    	}
	    	if(puedeRematar[jugador])
	    	{
    			Posicion jugadorPase = elegirMejorPase( sp, jugador, posicionJugadores);
    			comandos.add(new ComandoGolpearBalon(jugador, jugadorPase, 1,true));
	    	}
	    	else if( irHaciaElBalon[jugador] == 1 )
	    		comandos.add(new ComandoIrA(jugador, sp.balon()));
	    	else if( irHaciaElBalon[jugador] == 2 )
	    		comandos.add(new ComandoIrA(jugador, sp.balon().moverPosicion(0, -10)));
	    	else if( irHaciaElBalon[jugador] < 6 )
	    		comandos.add(new ComandoIrA(jugador, sp.balon().moverPosicion(5 * Math.signum(sp.balon().getX()), -10)));
	    	else
	    		comandos.add(new ComandoIrA(jugador, alineacion1[jugador]));
	    }    
	    private void TacticaMedioDelantero( SituacionPartido sp, boolean[] puedeRematar, Posicion[] posicionJugadores, int[] irHaciaElBalon, int jugador )
	    {
	    	if( puedeRematar[jugador] )
	    	{
	    		if( posicionJugadores[jugador].distancia(Constantes.centroArcoSup) < 25 )
	    			comandos.add(new ComandoGolpearBalon(jugador, Constantes.centroArcoSup, 1, 20));
	    		else
	    		{
	    			if( sp.balon().getX() > 0 )
		    			comandos.add(new ComandoGolpearBalon(jugador, alineacion1[9], 1,false));
	    			else
		    			comandos.add(new ComandoGolpearBalon(jugador, alineacion1[10], 1,false));	    				
	    		}
	    	}
	    	else if( sp.balon().getY() > 0)
	    	{
	    		if( irHaciaElBalon[jugador] == 1)
	    			comandos.add(new ComandoIrA(jugador, sp.balon()));
	    		else 
		    		comandos.add(new ComandoIrA(jugador, sp.balon().moverPosicion(0, -10)));
	    	}
	        else
	        	comandos.add(new ComandoIrA( jugador,alineacion1[jugador]));
	    	
	    }    

	    private void TacticaDelantero( SituacionPartido sp, boolean[] puedeRematar, Posicion[] posicionJugadores, int[] irHaciaElBalon, int jugador, int jugador2 )
	    {    
    		Posicion p = new Posicion( 5, 40);
    		Posicion miPosicion = sp.misJugadores()[jugador];

	    	if( Math.abs(sp.balon().getX()) > 11 && sp.balon().getY() > 35)
	    	{
	    		if(puedeRematar[jugador])
	    			comandos.add(new ComandoGolpearBalon(jugador, p, 0.7, false));
	    		else if (irHaciaElBalon[jugador] == 1)
	    			comandos.add(new ComandoIrA(jugador, sp.balon()));
	    		else	
	    			comandos.add(new ComandoIrA(jugador, p));
	    		return;
	    	}
	    	if( puedeRematar[jugador] )
	    	{
	    		if( posicionJugadores[jugador].distancia(Constantes.centroArcoSup) < 25 )
	    		{
    				double desplazamiento = 2;
    				if (sp.balon().getX() < 0) desplazamiento = -desplazamiento;
    				comandos.add(new ComandoGolpearBalon(jugador, Constantes.centroArcoSup.moverPosicion(desplazamiento,0), 1, 20));
	    		}
	    		else
	    		{
	                comandos.add(new ComandoIrA(jugador, Constantes.centroArcoSup));
	                comandos.add(new ComandoGolpearBalon(jugador));   			
	    		}
	    	}
	    	else if( sp.balon().getY() > 15)
	    	{
	    		if( irHaciaElBalon[jugador] < irHaciaElBalon[jugador2] || (( miPosicion.distancia(sp.balon()) < 5 ) && miPosicion.distancia(p) < 5))
	    			comandos.add(new ComandoIrA(jugador, sp.balon()));
	    		else
	    			comandos.add(new ComandoIrA(jugador, p));
	    	}
	        else
	        	comandos.add(new ComandoIrA( jugador,alineacion1[jugador]));	    	
	    }
	    
	    private Posicion elegirMejorPase( SituacionPartido sp, int jugador, Posicion[] posicionJugadores )
	    {
	    	double xBalon = sp.balon().getX();
	    	
	    	if( xBalon < 5 && xBalon > 5)
	    		return alineacion1[8];
	    	if( xBalon > 0 )
	    		return alineacion1[9];
	    	else 
	    		return alineacion1[10];   	
	    }   
	}
